package com.heima.leetcode.practice;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 238. 除自身以外数组的乘积
 * @date 2025/2/10 12:24
 */
public class E238 {

    /**
     * <h3>方法一：从左到右遍历一次统计左半乘积，从右往左遍历一遍统计右半乘积</h3>
     *
     * @param nums nums数组
     * @return 除了本身以外数组的乘积
     */
    public int[] productExceptSelf(int[] nums) {
        // 1. 准备一个数组，用来存储结果
        int[] answer = new int[nums.length];
        // 2. 从左到右遍历数组，计算左半边乘积，同时将结果存储到answer数组中
        int leftMul = 1;
        answer[0] = 1; // 要单独设置answer[0]为1，因为answer[0]的左半边乘积为1
        for (int i = 1; i < nums.length; i++) {
            leftMul *= nums[i - 1];
            answer[i] = leftMul;
        }
        // 3. 从右往左遍历数组，计算右半边乘积，同时将结果乘以answer[i]存到数组中
        int rightMul = 1;
        for (int i = nums.length - 2; i >= 0; i--) {
            rightMul *= nums[i + 1];
            answer[i] *= rightMul;
        }
        return answer;
    }
}
